﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Data;
using System.Reflection;

namespace produccion.forms
{
    /// <summary>
    /// Lógica de interacción para FRMfiltrar.xaml
    /// </summary>
    public partial class FRMbuscar : Window
    {
        string metodo;
        string campo;
        string propiedad;
        string camporeturn;
        DataTable busqueda;
        DataTable labels;
        Object tabla;
        Object tabla2;
        public string retorno;
        string metodoadd="";
        string propiedadadd="";

        //_tabla objeto de la clase donde se encuentra el metodo q realiza el filtro
        //_metodo nombre del metodo que ejecuta el filtro
        //_campo nombre del campo que se utiliza para filtrar (text para Label)
        //_propiedad nombre de la propiedad de la clase utilizada para hacer le filtro
        //_camporeturn nombre del campo en el dataGrid que debe retornar

   
        public FRMbuscar(Object _tabla, string _metodo, string _campo, string _propiedad, string _camporeturn, string _descripccion)
        {
            InitializeComponent();
            tabla = _tabla;
            metodo = _metodo;
            campo = _campo;
            camporeturn = _camporeturn;
            propiedad = _propiedad;
            tCampo.Text = campo.Replace("_", " ") + " ";
            this.Width = 380;
            grid1.Visibility = Visibility.Collapsed;
            dGbusqueda.HorizontalAlignment = HorizontalAlignment.Center;
            wrapPanel1.HorizontalAlignment = HorizontalAlignment.Center;
            border1.Width = 380;
            filtro.Text = _descripccion;
            filtro.Focus();
            filtro.Select(filtro.Text.Length, 0);
        }
        public FRMbuscar(Object _tabla,string _metodo,string _campo,string _propiedad,string _camporeturn)
        {
            InitializeComponent();
            tabla = _tabla;
            metodo = _metodo;
            campo = _campo;
            camporeturn = _camporeturn;
            propiedad = _propiedad;
            tCampo.Text = campo.Replace("_"," ")+" ";
            this.Width = 380;
            grid1.Visibility = Visibility.Collapsed;
            dGbusqueda.HorizontalAlignment = HorizontalAlignment.Center;
            wrapPanel1.HorizontalAlignment = HorizontalAlignment.Center;
            border1.Width = 380;
            filtro.Focus();
            filtro.Select(filtro.Text.Length, 0);
            
        }
        public FRMbuscar(Object _tabla, string _metodo, string _campo, string _propiedad, string _camporeturn, string _metodoadd, string _propiedadadd)
        {
            InitializeComponent();
            tabla = _tabla;
            tabla2 = _tabla;
            metodo = _metodo;
            campo = _campo;
            camporeturn = _camporeturn;
            propiedad = _propiedad;
            tCampo.Text = campo.Replace("_", " ") + " ";
            metodoadd = _metodoadd;
            propiedadadd = _propiedadadd;
            filtro.Focus();
            filtro.Select(filtro.Text.Length, 0);
        }

        private void buscar() 
        {
            if (filtro.Text.Length > 0)
            {

                MethodInfo magicMethod = tabla.GetType().GetMethod(metodo);
                PropertyInfo magicPro = tabla.GetType().GetProperty(propiedad);
                magicPro.SetValue(tabla, filtro.Text, new object[] { });
                object magicValue = magicMethod.Invoke(tabla, new object[] { });
                busqueda = (DataTable)magicValue;
                dGbusqueda.ItemsSource = busqueda.DefaultView;
            }
            else 
            {
                busqueda.Rows.Clear();
                dGbusqueda.ItemsSource = busqueda.DefaultView;            
            }
        
        }
        
        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            if (dGbusqueda.SelectedIndex == -1)
            {
                retorno = "";
            }
            else
            {
                if (busqueda.Rows.Count-1 >= dGbusqueda.SelectedIndex)
                {

                    retorno = busqueda.Rows[dGbusqueda.SelectedIndex][camporeturn].ToString();
                }
                else
                {
                    retorno = "";
                }
            }


        }

        private void dGbusqueda_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            this.Close();
        }

        private void filtro_TextChanged(object sender, TextChangedEventArgs e)
        {
            buscar();
        }
        
        private void dGbusqueda_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            stackPanel1.Children.Clear();
            if (metodoadd != "" && propiedadadd != "" && dGbusqueda.SelectedIndex!=-1)
            {
         
                MethodInfo magicMethod = tabla.GetType().GetMethod(metodoadd);
                PropertyInfo magicPro = tabla.GetType().GetProperty(propiedadadd);
                string key = busqueda.Rows[dGbusqueda.SelectedIndex][camporeturn].ToString();
                magicPro.SetValue(tabla,key, new object[] { });
                object magicValue= magicMethod.Invoke(tabla, new object[] { });
                labels = (DataTable)magicValue;
                for (int i = 0; i < labels.Columns.Count; i++)
                {
                    if (labels.Rows.Count > 0)
                    {
                        describir(labels.Columns[i].ColumnName, labels.Rows[0][i].ToString());
                    }
                }
            }
            
        }

        private void describir(string campo,string txt) 
        {
            TextBlock texto = new TextBlock();
            texto.HorizontalAlignment = HorizontalAlignment.Left;
            texto.VerticalAlignment = VerticalAlignment.Top;
            texto.Padding = new Thickness(4, 4, 4, 4);
            texto.TextWrapping = TextWrapping.Wrap;
            texto.Margin = new Thickness(4, 4, 4, 4);
            Run a = new Run();
            a.Text = campo.Replace("_"," ")+": ";
            a.FontWeight = FontWeights.Bold;
            a.FontSize = 13;
            texto.Inlines.Add(a);
            a = new Run();
            a.Text = txt;
            a.FontWeight = FontWeights.Normal;
            texto.Inlines.Add(a);
            texto.HorizontalAlignment = HorizontalAlignment.Left;
            texto.VerticalAlignment = VerticalAlignment.Top;
            stackPanel1.Children.Add(texto);        
        }

        private void dGbusqueda_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.Enter)
            {
                this.Close();
            }
        }

        private void Window_KeyDown(object sender, KeyEventArgs e)
        {
            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.F3 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta == true) { MDOgeneral.logBusquedadAbierta = false; }
            }

            if (e.Key == Key.F4 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta1 == true) { MDOgeneral.logBusquedadAbierta1 = false; }
            }

            if (e.Key == Key.F5 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta2 == true) { MDOgeneral.logBusquedadAbierta2 = false; }
            }
        }
      
    }
}
